package com.justnow.offer;

/**
 * @author justnow
 * Created on 2020-08-14
 * Description
 *
 * 请实现一个函数用来判断字符串是否表示数值（包括整数和小数）。
 * 例如，字符串"+100"、"5e2"、"-123"、"3.1416"、"-1E-16"、"0123"都表示数值，
 * 但"12e"、"1a3.14"、"1.2.3"、"+-5"及"12e+5.4"都不是.
 */
public class Solution20 {
    public boolean isNumber(String s) {
        if (s == null || s.length() == 0)
            return false;

        //标记是否遇到相应情况
        boolean numSeen = false;

        boolean dotSeen = false;

        boolean eSeen = false;

        char[] str = s.trim().toCharArray();//删除左右两边的空格，然后返回字符数组

        for (int i = 0; i < str.length; i++) {
            if (str[i] >= '0' && str[i] <= '9') {
                numSeen = true;
            } else if (str[i] == '.') {
                // . 之前不能出现. 或者 e
                if (dotSeen || eSeen) {
                    return false;
                }
                dotSeen = true;
            } else if (str[i] == 'e' || str[i] == 'E') {
                // e 之前不能出现e，必须出现数
                if (eSeen || !numSeen) {
                    return false;
                }
                eSeen = true;
                numSeen = false; //重置numSeen，排除123e或者123e+的情况，确保e之后也出现数
            } else if (str[i] == '-' || str[i] == '+') {
                // +-出现在0位置或者e/E的后面第一个位置才是合法的
                if (i != 0 && str[i - 1] != 'e' && str[i - 1] != 'E') {
                    return false;
                }
            } else { //其他不合法字段
                return false;
            }
        }

        //因为最终都是以‘0’到‘9’之间的字符结尾的，所以，如果numSeen为true的话，就说明没有问题
        return numSeen;
    }
}
